package com.kamistoat.ruoyi.ruoyimoduleslocalfile.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * MultipartFile配置。
 */
@Configuration
@ConfigurationProperties(prefix = "file")
@Data
public class FileConfig {
    /**
     * 文件服务器地址。或者说对于客户而言文件服务器的地址。实际项目中肯定是一个公网IP或者HOST域名
     */
    private String domain;

    /**
     * 上传的文件在本地的存储根路径
     */
    private String baseDir;

    /**
     * 文件资源映射路径的前缀。使用该前缀来判断请求是否为文件资源请求。<p>
     * 例如设置前缀为 /statics, 并在前端要求访问静态资源时统统在真实请求前加上 /statics，
     * 然后在后端拦截请求，如果请求路径以 /statics 开头，则认为是文件资源请求，则进行特定的处理(例如不设置用户检查直接返回)
     * <p>
     * 这里需要理解一下，这个前缀不是给POST请求(即上传文件)用的，而是给GET请求用的。
     * <p>
     * 这里先用OSS上云来解释一下。当我们给一个商品上传图片后，OSS会返回一个完整的请求域名.
     * 例如 https://kamistoat-gulimall.oss-cn-chengdu.aliyuncs.com/2021-10-10/05f12631-cb39-40ec-8d81-46bd76214ccc_8bf441260bffa42f.jpg <p>
     * 而这个域名会被前端代码直接嵌入到布局中，这样用户访问商品页面的时候，游览器向这个域名发送GET请求，就能得到图片。<p>
     * <b>P.S.这里可以直接说了OSS的结构，OSS根据首位host https://kamistoat-gulimall.oss-cn-chengdu.aliyuncs.com 精确路由到用户的桶。
     * 然后 /2021-10-10/05f12631-cb39-40ec-8d81-46bd76214ccc_8bf441260bffa42f.jpg 就是文件在这个桶中的绝对路径。</b>
     * <p>
     * 而在本地文件服务中，我们同样会在持久化文件后，返回GET这个文件的请求路径。之后就是完全相同的逻辑，嵌入前端页面后直接发GET获取来这个文件。
     * 那么为了让这个请求路径精确定位到文件，有三种做法:
     * 1.仿照OSS，也建立桶，请求的host部分用于定位桶，之后是文件在桶中的绝对路径。这种做法需要借助一些三方持久化框架来创建桶，例如 Minio，FastDfs等等。
     * 2.不使用三方框架，直接整个请求就是文件在计算机中的绝对路径，即 http://192.168.56.10/home/kamistoat/ruoyi/2022/09/09/testPic_05f12631-cb39-40ec.png
     * 3.但是很显然就能发现，方法2中根目录/home/kamistoat/ruoyi/ 对每个文件都是相同的，那完全可以替换成一个关键字，即返回 http://192.168.56.10/statics/2022/09/09/testPic_05f12631-cb39-40ec.png
     * 然后在后端拦截请求，将 /statics/ 再替换回根目录/home/kamistoat/ruoyi/
     * 本项目中，使用 纯粹本地持久化算法 就是使用方法3。 而 Minio和FastDfs框架则更偏向方法1，即和OSS类似
     * <p>
     * TODO 那么如何拦截呢？当然就是老熟人 WebMvcConfigurer了，在ResourcesConfig中具体实现
     */
    private String prefix;
}
